package com.lamou3g.code0509;

import javax.servlet.*;
import java.io.*;
/**
 * 今天课程小结:通过实现Servlet接口,达到了写的java代码能在浏览器中显现出来,即实现了java代码与web的连接
 * 1.每个servlet都会不同的事,浏览器访问tomcat时,tomcat会根据浏览器路径的不同,选择不同servlet来解决问题.
 * Servlet解释:
 * Servlet（Server Applet）是Java Servlet的简称，称为小服务程序或服务连接器，用Java编写的服务器端程序，主要功
 * 能在于交互式地浏览和修改数据，生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口，广义的Servlet是指任何
 * 实现了这个Servlet接口的类，一般情况下，人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲，
 * Servlet可以响应任何类型的请求，但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
 * 2.今天主要讲的是实现Servlet的三种方法:
 * 第一种:实现Servlet的接口,并覆写里面的所有5种方法(init,getServletConfig,service,getServletInfo,destroy)
 * 第二种:继承 GenericServlet方法(其实也就是init,getServletConfig,service,getServletInfo,destroy都在java中写好,
 * 你继承就可以有这些方法,只需要覆写service方法即可)
 * 第三种;继承HttpServlet(最常用),覆写里面的doGet方法(封装了和http协议(应用层协议,里面有状态码)相关的东西,方法已经封装好,只需要覆
 * 写doGet方法)
  */


//实现servlet的第一种方式:
//生命周期方法:init(出生,用来加载初始化配置),service(每次访问都会走),destroy(结束,用来保存最后的一些信息,下次用的时候可以启用)
public class AServlet implements Servlet {
    //servlet 全局只有这么一个对象
    //多线程操作全局变量会产生线程安全问题
    //在servlet中,禁止使用全局变量(等级一,等级最低)
    private int count=0;//访问量
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        //当这个servlet第一次被启动的时候
        //会执行该方法,这个方法只会执行一次
        //叫做初始化方法
        //ServletConfig 传递servlet的配置信息
        System.out.println("init");
    }

    @Override
    public ServletConfig getServletConfig() {
        //一般是用来获取servlet配置信息的
        //返回对象就是init方法中传入的那个
        //这个方法是手动调用的
        return null;
    }

    @Override
    public void service(ServletRequest req, ServletResponse resp) throws ServletException, IOException {
        count++;
        PrintWriter pw=resp.getWriter();
        //这种方式获取的文件路径,在这个类的文件夹中(为了解决不适用绝对路径而写的方法)
        InputStream is=getClass().getResourceAsStream("A.html");
        BufferedReader reader=new BufferedReader(new InputStreamReader(is));
        String line="";
        while ((line=reader.readLine())!=null){
            pw.println(line);
        }
        reader.close();
        pw.close();
        pw.println("count:"+count);
        //这个方法最重要
        //每一次访问servlet都会执行该方法
        //这个方法的作用就是提供服务的
        System.out.println("service");
    }

    @Override
    public String getServletInfo() {
        //获取servlet信息的
        //这个信息随便写,一般来说
        //这是一个一点用也没有的方法
        return "我是一个快乐的servlet";
    }

    @Override
    public void destroy() {
        //他会在servlet被销毁之前被调用
        //servlet最后一个执行的方法
        System.out.println("destroy");
    }
}
